home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dev / devSysgenTape.c < prev    next >
C/C++ Source or Header  |  1992-12-18  |  4KB  |  118 lines

  1. /* 
  2.  * devSCSISysgen.c --
  3.  *
  4.  *      Procedures that set up command blocks and process sense
  5.  *    data for Sysgen tape drives.
  6.  *
  7.  * Copyright 1986 Regents of the University of California
  8.  * All rights reserved.
  9.  */
  10.  
  11. #ifndef lint
  12. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/dev/devSysgenTape.c,v 9.1 91/08/19 13:48:15 jhh Exp $ SPRITE (Berkeley)";
  13. #endif /* not lint */
  14.  
  15.  
  16. #include <sprite.h>
  17. #include <dev.h>
  18. #include <devInt.h>
  19. #include <sys/scsi.h>
  20. #include <scsiDevice.h>
  21. #include <scsiHBA.h>
  22. #include <scsiTape.h>
  23. #include <fs.h>
  24. #include <sysgenTape.h>
  25.  
  26. /*
  27.  * Sense data returned from the Sysgen tape controller.
  28.  * This matches the ARCHIVE Sidewinder drive specifications, and the
  29.  * CIPHER Quarterback drive specifications.
  30.  */
  31. #define SYSGEN_SENSE_BYTES    16
  32. typedef struct {
  33.     /*
  34.      * Standard 4-bytes of sense data, not class 7 extended sense.
  35.      */
  36.     unsigned char valid        :1;    /* Sense data is valid */
  37.     unsigned char error        :7;    /* 3 bits class and 4 bits code */
  38.     unsigned char highAddr;        /* High byte of block address */
  39.     unsigned char midAddr;        /* Middle byte of block address */
  40.     unsigned char lowAddr;        /* Low byte of block address */
  41.     /*
  42.      * Additional 12 bytes of sense data specific to Sysgen drives.
  43.      */
  44.     unsigned char bitSet1    :1;    /* More bits set in this byte */
  45.     unsigned char noCartridge    :1;    /* The tape cartridge isn't there */
  46.     unsigned char noDrive    :1;    /* No such drive (check subUnitID) */
  47.     unsigned char writeProtect    :1;    /* The drive is write protected */
  48.     unsigned char endOfTape    :1;    /* End of tape encountered */
  49.     unsigned char dataError    :1;    /* Data error on the tape, fatal */
  50.     unsigned char noError    :1;    /* No error in the data */
  51.     unsigned char fileMark    :1;    /* File mark encountered */
  52.  
  53.     unsigned char bitSet2    :1;    /* More bits set in this byte */
  54.     unsigned char badCommand    :1;    /* A bad command was specified */
  55.     unsigned char noData    :1;    /* Counld't find the data */
  56.     unsigned char retries    :1;    /* Had to retry more than 8 times */
  57.     unsigned char beginOfTape    :1;    /* At beginning of tape */
  58.     unsigned char pad1        :2;    /* reserved */
  59.     unsigned char powerOnReset    :1;    /* Drive reset sinse last command */
  60.  
  61.     short    numRetries;        /* Number of retries */
  62.     short    underruns;        /* Number of underruns */
  63.     /*
  64.      * The following comes from the sysgen controller in copy commands
  65.      * which we don't use.
  66.      */
  67.     char numDiskBlocks[3];        /* Num disk blocks transferred */
  68.     char numTapeBlocks[3];        /* Num tape blocks transferred */
  69.  
  70. } DevQICIISense;            /* Known to be 16 Bytes big */
  71.  
  72.  
  73. /*
  74.  *----------------------------------------------------------------------
  75.  *
  76.  * DevSysgenAttach --
  77.  *
  78.  *    Verify and attach a Sysgen tape drive.
  79.  *
  80.  * Results:
  81.  *    SUCCESS if the device is a working Sysgen tape drive.
  82.  *    DEV_NO_DEVICE if the device is not a working Sysgen tape drive.
  83.  *
  84.  * Side effects:
  85.  *    Sets the type and call-back procedures.
  86.  *
  87.  *----------------------------------------------------------------------
  88.  */
  89. /*ARGSUSED*/
  90. ReturnStatus
  91. DevSysgenAttach(devicePtr, devPtr, tapePtr)
  92.     Fs_Device    *devicePtr;    /* Fs_Device being attached. */
  93.     ScsiDevice    *devPtr;    /* SCSI device handle for drive. */
  94.     ScsiTape    *tapePtr;    /* Tape drive state to be filled in. */
  95. {
  96.     ScsiCmd        senseCmd;
  97.     ReturnStatus    status;
  98.     static char        senseData[SCSI_MAX_SENSE_LEN];
  99.     int            length;
  100.  
  101.     /*
  102.      * Since we don't know about the inquiry data (if any) returned by 
  103.      * the Sysgen tape, check using the size of the SENSE data returned.
  104.      */
  105.     DevScsiSenseCmd(devPtr, SCSI_MAX_SENSE_LEN, senseData, &senseCmd);
  106.     status = DevScsiSendCmdSync(devPtr, &senseCmd, &length);
  107.     if ( (status != SUCCESS) || 
  108.          (senseCmd.statusByte != 0) ||
  109.      (senseCmd.senseLen != SYSGEN_SENSE_BYTES)) {
  110.     return DEV_NO_DEVICE;
  111.     }
  112.     /*
  113.      * Take all the defaults for the tapePtr.
  114.      */
  115.     tapePtr->name = "Sysgen Tape";
  116.     return SUCCESS;
  117. }
  118.